import java.util.*;
import _Utils.*;
import _Banque.*;
import _Exception.*;

public abstract class DemonstrationBanque
{
	public static void main(String[] args) throws Exception
	{
        /// La methode 'print' est declarée plus bas
        
        print();
        
        print("*** Bienvenue dans le programme de demonstration " +
        "du package _Banque ***");
        
        print();
        print();
        print();
        
        print("*** Premiere partie :\npresentation des creations de banques, " + 
                "agences, titulaires, comptes bancaires et " + 
                "operations bancaires***");
        print();
        print();
        
        print("*** Creation d'une banque ***");
        print();
   
		Banque bnp = new Banque("BNP", "16654", 
		                "31 avenue de la Republique, PARIS", "59871563457824");
	    print(bnp);
	    
	    print();
		
		print("*** Creation de 3 agences bancaires de la BNP : \n" +
		        "deux en region PACA et une en Ile de France ***");
        print();
        
		bnp.creerRegion("PACA");
        bnp.creerRegion("Ile de France");
        
		int buffer = bnp.ouvrirAgence("PACA", "55 avenue Jean Medecin, NICE");
		AgenceBancaire agenceNice = bnp.getAgence(buffer);
		
		buffer = bnp.ouvrirAgence("PACA", "14 rue de bob l'eponge, PEGOMAS");
		AgenceBancaire agencePegomas = bnp.getAgence(buffer);
		
		buffer = bnp.ouvrirAgence("Ile de France", "20 rue de la Paix, PARIS");
		AgenceBancaire agenceParis = bnp.getAgence(buffer);
		
		print("* Affichage de la premiere agence : ");
        print(agenceNice);
        print();
        
        print("* Affichage de la deuxieme agence : ");
        print(agencePegomas);
        print();
        
        print("* Affichage de la troisieme agence : ");
        print(agenceParis);
		print();
		
		
		print("*** Creation de plusieurs titulaires ***");
		print();
		
		HashMap<String, Titulaire> titulaires = 
		           (HashMap<String, Titulaire>)Data.load("titulaires", "1.1.0");
		
		print("* Affichage d'un titulaire : ");
		Titulaire quentin = titulaires.get("quentin");
		print(quentin);
		print();
		
		print("* Affichage d'un deuxieme titulaire : ");
		Titulaire lucas = titulaires.get("lucas");
		print(lucas);
		print();
		
		print();
		
		print("*** Ouverture de plusieurs comptes ***");
		print();
		
		print("* Compte Courant à l'agence de Nice pour Quentin");
		long num = agenceNice.ouvrirCompte(quentin);
		CompteCourant ccQuentin = (CompteCourant)agenceNice.compteBancaire(num);
		print(ccQuentin);
		print();
		
		print("* Compte Epargne à taux de 1% à l'agence de Paris pour Lucas");
		num = agenceParis.ouvrirCompte(lucas, 1);
		CompteEpargne ceLucas = (CompteEpargne)agenceParis.compteBancaire(num);
		print(ceLucas);
		print();
		
		print();
		
		print("*** Operations sur les comptes ***");
		print();
		
		print("* Versement de 150€ sur le compte de Quentin");
		ccQuentin.executer("Versement 150", 'V', 150);
		print(ccQuentin);
		print();
		
		print("* Versement de 2500€ sur le compte de Lucas");
		ceLucas.executer("Versement 2500", 'V', 2500);
		print(ceLucas);
		print();
		
		print("* Transfert de 500€ du compte de Lucas vers le compte de " +
		        "Quentin");
		ceLucas.executer("Transfert -> Quentin", 'R', 500);
		ccQuentin.executer("Transfert <- Lucas", 'V', 500);
		print(ccQuentin);
		print(ceLucas);
		print();
		
		print();
		
		print("*** Ajout de deux nouveaux titulaires ***");
		print();
		
		Titulaire anais = titulaires.get("anais");
		print(anais);
		print();
		
		Titulaire kevinC = titulaires.get("kevinC");
		print(kevinC);
		print();
		
		print("* Ouverture de deux nouveaux comptes dans l'agence de Nice");
		num = agenceNice.ouvrirCompte(anais);
		CompteCourant ccAnais = (CompteCourant)agenceNice.compteBancaire(num);
		ccAnais.executer("Versement initial", 'V', 500.50f);
		print(ccAnais);
		
		num = agenceNice.ouvrirCompte(kevinC, 1);
		CompteEpargne ceKevin = (CompteEpargne)agenceNice.compteBancaire(num);
		ceKevin.executer("Versement initial", 'V', 1500);
		print(ceKevin);
		
		print();
		
		print("*** Affichage de quelques statistiques ***");
		print();
		
		print("* Argent total dans la region PACA");
		print(bnp.totalDepots('C', "PACA") + bnp.totalDepots('E', "PACA"));

		print("* Argent total dans la region Ile de France");
		print(bnp.totalDepots('C', "Ile de France") + 
		                                bnp.totalDepots('E', "Ile de France"));

		print("* Nombre total de client dans la banque");
		print(bnp.nombreClients());
		
		
		print();
        print();
        
        print("*** Deuxieme partie :\n" + 
        " demonstration de la serialisation \n" + 
        " en montrant des statistiques " + 
        "depuis une banque créée précédemment ***");
        print();
        print();
		
		print("* Recuperation de la banque");
		Banque bce = (Banque)Data.load("banque_15", "1.1.0");
		print(bce);
		print();

		print("* Nombre total de client dans la banque");
		print(bce.nombreClients());
		print();
		
        print("* Nombre d'agences de la banque");
        print(bce.nombreAgences());
        print();
        
        print("* Recuperation de l'adresse de la premiere agence de la banque");
        agenceNice = bce.getAgence(1001);
        print(agenceNice);
		print();
		
	    print("* Nombre de comptes courant dans la premiere agence de la banque");
	    print(agenceNice.nombreComptes('C'));
	    print();
	    
	    print("* Nombre d'operations datant du 14/12/2011 pour la premiere agence");
	    print(agenceNice.nombreOperations("2011/12/14"));
	    print();
	    
	    print("* Depot total detenu par la premiere agence");
	    print(agenceNice.totalDepots('C') + agenceNice.totalDepots('E'));
	    print();
	    
	    print("* Depot total detenu par la deuxieme agence");
	    print(bce.getAgence(1002).totalDepots('C') + 
	                bce.getAgence(1002).totalDepots('E'));
	    print();
	    
	    print("* Depot total detenu par la banque");
	    print(bce.totalDepots());
	    print(); 
	    
	    
        print("*** Fin de la demonstration ***");
	}

    /**
    * Methode print = System.out.println
    * créée uniquement par flemme d'ecrire "System.out.println" 
    **/
    public static void print(String chaine)
    {
        System.out.println(chaine);
    }

    public static void print(Object obj)
    {
        System.out.println(obj);
    }
    
    public static void print()
    {
        System.out.println();
    }

}
